package com.redepronik.negosysres.invfac.controller;

import static com.redepronik.negosys.utils.Utils.parametro;

import java.io.File;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import net.sourceforge.barbecue.BarcodeFactory;
import net.sourceforge.barbecue.BarcodeImageHandler;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entityAux.CodigoProductoReporte;
import com.redepronik.negosys.invfac.service.ProductoService;
import com.redepronik.negosys.utils.service.ReporteService;

@Controller
@Scope("session")
public class CodigoBarraBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	private ProductoService productoService;

	@Autowired
	private ReporteService reporteService;

	private List<Producto> listaProductoBusqueda;
	private String criterioProductoBusqueda;
	private Producto producto;
	private String codigoTipo;
	private String codigo;
	private StreamedContent codigoBarra;

	public CodigoBarraBean() {
		limpiarObjetosBusquedaProductos();
		codigoTipo = "ean";
	}

	public void generarCodigo() {
		if (producto != null && producto.getProductoid() != null) {
			if (codigoTipo.compareTo("ean") == 0) {
				codigo = producto.getEan();
			} else if (codigoTipo.compareTo("codigo1") == 0) {
				codigo = producto.getCodigo1();
			} else if (codigoTipo.compareTo("codigo2") == 0) {
				codigo = producto.getCodigo2();
			}
			try {
				File codigoBarraFile = new File("dynamiccodigoBarra");
				BarcodeImageHandler.saveJPEG(
						BarcodeFactory.createCode128(codigo), codigoBarraFile);
				codigoBarra = new DefaultStreamedContent(new FileInputStream(
						codigoBarraFile), "image/jpeg");
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "ESCOJA UN PRODUCTO"));
	}

	public String getCodigo() {
		return codigo;
	}

	public StreamedContent getCodigoBarra() {
		return codigoBarra;
	}

	public String getCodigoTipo() {
		return codigoTipo;
	}

	public String getCriterioProductoBusqueda() {
		return criterioProductoBusqueda;
	}

	public List<Producto> getListaProductoBusqueda() {
		return listaProductoBusqueda;
	}

	public Producto getProducto() {
		return producto;
	}

	public void limpiarObjetosBusquedaProductos() {
		criterioProductoBusqueda = new String();
		listaProductoBusqueda = new ArrayList<Producto>();
		producto = new Producto();
	}

	public void obtenerProducto() {
		producto = productoService.obtenerPorProductoId(producto
				.getProductoid());
		generarCodigo();
	}

	public void obtenerProductosPorBusqueda() {
		if (criterioProductoBusqueda.length() >= 0
				&& criterioProductoBusqueda.length() <= 3)
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "INGRESE MAS DE 3 CARACTERES"));
		else {
			listaProductoBusqueda = productoService
					.obtenerParaBusqueda(criterioProductoBusqueda.toUpperCase());
			if (listaProductoBusqueda.isEmpty())
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"NO SE ENCONTRO NINGUNA COINCIDENCIA"));
			criterioProductoBusqueda = new String();
		}
	}

	private void presentaMensaje(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void reporteCodigoProducto(ActionEvent actionEvent) {
		RequestContext context = RequestContext.getCurrentInstance();
		boolean bn = false;

		if (producto == null || producto.getProductoid() == null
				|| producto.getProductoid() == 0) {
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "ESCOJA UN PRODUCTO"));
			bn = true;
		} else {
			generarCodigo();
			List<CodigoProductoReporte> lista = new ArrayList<CodigoProductoReporte>();
			lista.add(new CodigoProductoReporte(codigo, productoService.nombre(
					producto).getNombreimprimir(), parametro
					.getNombrecomercial()));
			Map<String, Object> parametros = new HashMap<String, Object>();
			parametros.put("razonSocial", parametro.getNombrecomercial());
			parametros.put("paginaWeb", "WWW."
					+ parametro.getNombrecomercial().replaceAll(" ", "")
					+ ".COM");
			reporteService.generarReportePDFSencillo(lista, parametros,
					"codigoBarra");
		}
		context.addCallbackParam("error", bn ? true : false);
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public void setCodigoBarra(StreamedContent codigoBarra) {
		this.codigoBarra = codigoBarra;
	}

	public void setCodigoTipo(String codigoTipo) {
		this.codigoTipo = codigoTipo;
	}

	public void setCriterioProductoBusqueda(String criterioProductoBusqueda) {
		this.criterioProductoBusqueda = criterioProductoBusqueda;
	}

	public void setListaProductoBusqueda(List<Producto> listaProductoBusqueda) {
		this.listaProductoBusqueda = listaProductoBusqueda;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

}
